﻿#include<iostream>
#include<string>
using namespace std;
////class Person
////{
////public:
////	void Print()
////	{
////		cout << "name:" << _name << endl;
////		cout << "age:" << _age << endl;
////	}
////protected:
////	string _name = "peter"; // 姓名
////	int _age = 18; // 年龄
////};
////// 继承后父类的Person的成员（成员函数+成员变量）都会变成子类的一部分。这里体现出了
//////Student和Teacher复用了Person的成员。下面我们使用监视窗口查看Student和Teacher对象，可
//////以看到变量的复用。调用Print可以看到成员函数的复用。
////class Student : public Person
////{
////protected:
////	int _stuid; // 学号
////};
////
////class Teacher : public Person
////{
////protected:
////	int _jobid; // 工号
////};
////int main()
////{
////	//Student s;
////	//Teacher t;
////	//s.Print();
////	//t.Print();
////
////	Person P;
////	Student s;
////	//派生类对象赋值给基类对象，不存在类型转换
////	P = s;
////	//赋值给引用
////	Person& rp = s;
////	//赋值给指针
////	Person* ptrp = &s;
////
////	return 0;
////}
//
//
////#include<iostream>
////#include<string>
////using namespace std;
////class Person
////{
////protected:
////	string _name = "peter"; // 姓名
////	int _num = 111; //身份证号
////};
////class Student : public Person
////{
////public:
////	void Print()
////	{
////		cout << " 姓名:" << _name << endl;
////		cout << " 身份证号:" << Person::_num << endl;
////		cout << " 学号:" << _num << endl;
////	}
////
////protected:
////	int _num = 222; //学号
////};
////
////int main()
////{
////	Student s1;
////	s1.Print();
////	return 0;
////}
//
//
//
////#include<iostream>
////#include<string>
////using namespace std;
////// B中的fun和A中的fun不是构成重载，因为不是在同一作用域
////// B中的fun和A中的fun构成隐藏，成员函数满足函数名相同就构成隐藏
////class A
////{
////public:
////	void fun()
////	{
////		cout << "func()" << endl;
////	}
////};
////class B : public A
////{
////public:
////	void fun(int a)
////	{
////		A::fun();
////		cout << "func(int i)->" << a << endl;
////	}
////
////protected:
////	int _num = 222; //学号
////};
////
////int main()
////{
////	B b1;
////	//b1.fun();//error,这里编译器报错，因为需要传入一个int类型的参数
////	b1.fun(1);//这个才是正确的
////	return 0;
////}
//
//class Person
//{
//public:
//	//构造函数
//	Person(const char* name = "peter")
//		: _name(name)
//	{
//		cout << "Person()" << endl;
//	}
//
//	//Person(const char* name)
//	//	: _name(name)
//	//{
//	//	cout << "Person()" << endl;
//	//}
//
//	//拷贝构造函数
//	Person(const Person& p)
//		: _name(p._name)
//	{
//		cout<< "Person(const Person& p)" << endl;
//	}
//
//	//赋值
//	Person& operator=(const Person& p)
//	{
//		cout << "Person operator=(const Person& p)" << endl;
//		if (this != &p)
//			_name = p._name;
//		return *this;
//	}
//	
//	//析构函数
//	~Person()
//	{
//		cout << "~Person()" << endl;
//	}
//protected:
//	string _name; // 姓名
//};
//
//class Student : public Person
//{
//public:
//	//Student(const char* name,int num)
//	//	:Person(name)
//	//	,_num(num)
//	//{}
//
//	Student(const Student& s)
//		:Person(s)
//		,_num(s._num)
//	{}
//
//	Student& operator=(const Student& s)
//	{
//		if (this != &s)
//		{
//			Person::operator=(s);
//			_num = s._num;
//		}
//	}
//	void Print() {};
//	~Student()
//	{
//		//Person::~Person();
//
//	}
//
//protected:
//	int _num;//学号
//
//};
//
//int main()
//{
//	Student* s1;
//
//	s1->Print();
//
//	return 0;
//}



//class Student;
//class Person
//{
//public:
//	friend void Display(const Person& p, const Student& s);
//protected:
//	string _name; // 姓名
//};
//class Student : public Person
//{
//protected:
//	int _stuNum; // 学号
//};
//void Display(const Person& p, const Student& s)
//{
//	cout << p._name << endl;
//	cout << s._stuNum << endl;//error  报错，因为派生类的私有和保护成员不能被基类的友元函数访问
//}
//void main()
//{
//	Person p;
//	Student s;
//	Display(p, s);
//}



//class Person
//{
//public:
//	Person() { ++_count; }
//protected:
//	string _name; // 姓名
//public:
//	static int _count; // 统计人的个数。
//};
//int Person::_count = 0;
//class Student : public Person
//{
//protected:
//	int _stuNum; // 学号
//};
//class Graduate : public Student
//{
//protected:
//	string _seminarCourse; // 研究科目
//};
//void TestPerson()
//{
//	Student s1;
//	Student s2;
//	Student s3;
//	Graduate s4;
//	cout << " 人数 :" << Person::_count << endl;
//	Student::_count = 0;
//	cout << " 人数 :" << Person::_count << endl;
//}


//class Person
//{
//public:
//	Person() { ++_count; }
//
//	void Print()
//	{
//		cout << this << endl;
//		//cout << _name << endl;   //error，
//		cout << _count << endl;
//	}
//
////protected:
//	string _name; // 姓名
//public:
//	static int _count; // 统计人的个数。
//};
//
//int Person::_count = 0;
//
//class Student : public Person
//{
//protected:
//	int _stuNum; // 学号
//};
//
//
//int main()
//{
//	Person p;
//	Student s;
//
//	Person* ptr = nullptr;
//	//cout << ptr->_name << endl;  // no
//	ptr->Print();                // ok
//	cout << ptr->_count << endl; // ok
//
//	(*ptr).Print();             // ok
//	cout << (*ptr)._count << endl; // ok
//
//	return 0;
//}


//class Person
//{
//public:
//	string _name; // 姓名
//	// id 家庭住址 身份证号码
//};
//
//class Student :virtual public Person
//{
//protected:
//	int _num; //学号
//};
//
//class Teacher :virtual public Person
//{
//protected:
//	int _id; // 职工编号
//};
//
//class Assistant : public Student, public Teacher
//{
//protected:
//	string _majorCourse; // 主修课程
//};
//
//// 数据冗余/二义性
//int main()
//{
//	Assistant a;
//	a._name = "小张";
//	Teacher t;
//	t._name = "张老师";
//	Student s;
//	s._name = "张三";
//
//	return 0;
//}



class A
{
public:
	int _a;
};

class B : virtual public A  //B虚拟继承A
{
public:
	int _b;
};

class C : virtual public A  //C虚拟继承A
{
public:
	int _c;
};

class D : public B, public C //D继承B和C
{
public:
	int _d;
};

int main()
{
	D d;
	d._b = 1;
	d._c = 2;
	d._d = 3;
	d.B::_a = 4;
	d.C::_a = 5;
	d._a = 6;

	B b;
	b._a = 1;
	b._b = 2;
	B* ptr = &b;
	ptr->_a = 10;
	ptr->_b = 11;

	ptr = &d;
	ptr->_a = 20;
	ptr->_b = 21;
	return 0;
}